package someTestExcemple.innerClassTest;


public class outerClass {
    private String outerName;
    private int outerAge;
    private int id = 100;
    public static int schoolId = 0;

    public outerClass(String outerName, int outerAge,int id) {
        this.outerName = outerName;
        this.outerAge = outerAge;
        this.id = id;
    }

    public outerClass() {
    }
    public static void outerClassMethod() {
        System.out.println("outerClassMethod");
    }

    //1.成员内部类 它可以有正常的成员变量和成员方法
    public class inner {
        private String name;
        //public static int id = 0; //jdk16之后才支持定义静态成员
        private int id =1200;

        public inner(String name) {
            this.name = name;
            //构造函数没有返回类型，甚至也没有void关键字
            //如果一个类没有显式定义任何构造函数，
            //Java编译器会提供一个默认的无参构造函数。但一旦定义了至少一个构造函数，编译器就不会再提供默认构造函数。
        }

        public void innerMethod() {
            int id = 20;
            System.out.println("innerMethod--id:" + id);
            System.out.println("inner id:" + this.id);
            //!!!通过外部类名.this拿到外部类对象
            System.out.println("outer id:" + outerClass.this.id);
            System.out.println("inner--innerMethod");
            //内部类可以访问外部类的所有成员，包括私有的
            System.out.println("outerName:" + outerName);
            System.out.println("outerAge:" + outerAge);
            //外部类的静态成员
            System.out.println("schoolId:" + schoolId);
        }
    }
    //2.静态内部类 有static修饰的内部类 外部类所持有
    public static class staticInner {
        private String name;
        private int id = 101;
        public static int schoolId = 9970;
        private int age;

        public staticInner(String name, int age) {
            this.name = name;
            this.age = age;
        }
        public void staticInnerMethod() {
            System.out.println("staticInnerMethod--id:" + id);
            System.out.println("outClass schoolId:" + schoolId);
            outerClass.outerClassMethod();
            //静态内部类如同静态成员方法一样，可以直接访问外部类的静态成员和静态方法
            //也不能直接访问外部类的非静态成员
            //System.out.println(outerClass.this.outerAge);
        }
    }

    //3.局部内部类 定义在方法体中，代码块中，构造体等执行体中
    public void go() {
        class localInner {
            public void localInnerMethod() {
                System.out.println("这是一个局部内部类的一个方法-->localInnerMethod");
            }
        }
        abstract class localInner2 {

        }
    }


}
